/**
 * @description 获取用户信息[withCredentials为true时需要先调用wx.login接口]
 * @param {Boolean} withCredentials 是否带上登录态信息(since 1.1.0)
 * @param {String} lang 指定返回用户信息的语言[zh_CN 简体中文,zh_TW 繁体中文,en 英文;默认为en](since 1.3.0)
 * @param {Number} timeout 超时时间[单位:ms](since 1.9.90)
 */
export function getWxUserInfo(withCredentials = true, lang = 'en', timeout) {
  return new Promise(function (resolve, reject) {
    wx.getUserInfo({
      withCredentials: withCredentials,
      lang: lang,
      timeout: timeout,
      success: res => {
        let data = {
          error: 'success',
          error_description: '成功',
          code: 200,
          userInfo: res.userInfo
        }
        if (console.group) {
          console.group('wx')
          console.log('wx.getUserInfo')
          console.log(data)
          console.groupEnd()
        }
        resolve(data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: '网络异常',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}

/**
 * @description 将本地资源上传到开发者服务器,客户端发起一个HTTPS POST请求,其中content-type为multipart/form-data
 * @param {String} url 开发者服务器url(require)
 * @param {String} filePath 要上传文件资源的路径[如页面通过wx.chooseImage等接口获取到一个本地资源的临时文件路径](require)
 * @param {String} name 文件对应的key,开发者在服务器端通过这个key可以获取到文件二进制内容(require)
 * @param {Object} header HTTP请求Header,header中不能设置Referer
 * @param {Object} formData HTTP请求中其他额外的form data
 */
export function WxUploadFile(url, filePath, name, header = {
  'content-type': 'multipart/form-data'
}, formData) {
  return new Promise(function (resolve, reject) {
    wx.uploadFile({
      url: url,
      filePath: filePath,
      name: name,
      header: header,
      formData: formData,
      success: function (res) {
        let data = {
          error: 'success',
          error_description: '成功',
          code: 200,
          data: res.data,
          statusCode: res.statusCode
        }
        if (console.group) {
          console.group('wx')
          console.log('wx.uploadFile')
          console.log(data)
          console.groupEnd()
        }
        resolve(data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: '网络异常',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}

/**
 * @description 下载文件资源到本地,客户端直接发起一个HTTP GET请求,返回文件的本地临时路径
 * @param {String} url 下载资源的url(require)
 * @param {Object} header HTTP请求Header,header中不能设置Referer
 */
export function WxDownloadFile(url, header = {
  'content-type': 'multipart/form-data'
}) {
  return new Promise(function (resolve, reject) {
    wx.downloadFile({
      url: url,
      header: header,
      success: function (res) { // 下载成功后以tempFilePath的形式传给页面,res = {tempFilePath: '文件的临时路径'}
        let data = {
          error: 'success',
          error_description: '成功',
          code: 200,
          tempFilePath: res.tempFilePath, // 临时文件路径,下载后的文件会存储到一个临时文件
          statusCode: res.statusCode
        }
        if (console.group) {
          console.group('wx')
          console.log('wx.downloadFile')
          console.log(data)
          console.groupEnd()
        }
        resolve(data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: '网络异常',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}

/**
 * @description 从本地相册选择图片或使用相机拍照
 * @param {Number} count 最多可以选择的图片张数,默认9
 * @param {Array} sizeType original原图,compressed压缩图,默认二者都有
 * @param {Array} sourceType album从相册选图,camera使用相机,默认二者都有
 */
export function WxChooseImage(count = 9, sizeType, sourceType) {
  return new Promise(function (resolve, reject) {
    wx.chooseImage({
      count: count,
      sizeType: sizeType,
      sourceType: sourceType,
      success: function (res) { // 成功则返回图片的本地文件路径列表tempFilePaths,tempFiles(since 1.2.0)[图片的本地文件列表,每一项是一个File对象,(path:本地文件路径;size:本地文件大小,单位:B)]
        let data = {
          error: 'success',
          error_description: '成功',
          code: 200,
          tempFilePaths: res.tempFilePaths, // 图片的本地文件路径列表[StringArray]
          tempFiles: res.tempFiles // 图片的本地文件列表,每一项是一个File对象[ObjectArray]
        }
        if (console.group) {
          console.group('wx')
          console.log('wx.chooseImage')
          console.log(data)
          console.groupEnd()
        }
        resolve(data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: '网络异常',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}

/**
 * @description 发送模板消息
 * @param {String} url 接口地址[https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=ACCESS_TOKEN]
 * @param {String} touser 接收者(用户)的openid 
 * @param {String} template_id 所需下发的模板消息的id
 * @param {String} form_id 表单提交场景下,为submit事件带上的formId;支付场景下,为本次支付的prepay_id
 * @param {Object} data 模板内容,不填则下发空模板
 * @param {String} page 点击模板卡片后的跳转页面,仅限本小程序内的页面;支持带参数,(示例index?foo=bar)该字段不填则模板无跳转
 * @param {String} emphasis_keyword 模板需要放大的关键词,不填则默认无放大
 * @param {String} color 模板内容字体的颜色,不填默认黑色[废弃]
 */
export function WxSendTemplate(url, touser, template_id, form_id, data, page, emphasis_keyword, color = '#000') {
  let pars = {
    touser: touser,
    template_id: template_id,
    form_id: form_id,
    data: data,
    page: page,
    color: color,
    emphasis_keyword: emphasis_keyword
  };
  return new Promise(function (resolve, reject) {
    wx.request({ // 网络请求
      url: url,
      data: pars,
      method: 'POST',
      success: function (res) { // success网络请求成功
        if (console.group) {
          console.group('post')
          console.log(url + "?" + JSON.stringify(pars))
          console.log(res.data)
          console.groupEnd()
        }
        if (res.statusCode != 200) { // 开发者服务器返回的 HTTP 状态码
          reject({
            error: '服务器繁忙,请稍后重试',
            error_description: '服务器繁忙,请稍后重试',
            code: 500
          })
          return
        }
        resolve(res.data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: '网络异常',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}

/**
 * @description 微信小程序支付
 * @param {String} timeStamp 时间戳从1970年1月1日00:00:00至今的秒数,即当前的时间
 * @param {String} nonceStr 随机字符串,长度为32个字符以下
 * @param {String} _package 统一下单接口返回的,prepay_id参数值,提交格式如prepay_id=*
 * @param {String} signType 签名算法,暂支持MD5
 * @param {String} paySign 签名,具体签名方案参见小程序支付接口文档
 */
export function WxPayment(timeStamp, nonceStr, _package, signType, paySign) {
  return new Promise(function (resolve, reject) {
    wx.requestPayment({
      timeStamp: timeStamp,
      nonceStr: nonceStr,
      package: _package,
      signType: signType,
      paySign: paySign,
      success: res => {
        let data = {
          error: 'success',
          error_description: '成功',
          code: 200
        }
        resolve(data)
      },
      fail: function (error) { // fail调用接口失败
        console.error('error:' + JSON.stringify(error))
        reject({
          error: 'network_error',
          error_description: '网络异常',
          code: 0
        })
      },
      complete: function (res) { // complete

      }
    })
  })
}